iT邦幫忙

2023 iThome 鐵人賽

DAY 28
0
Mobile Development

iOS 菜雞的開發日記系列 第 28

鐵人賽 [Day 28] ARKit 教學(3)

  • 分享至 

  • xImage
  •  

大家好!今天我要教大家怎麼使用 ARKit 來追蹤使用者的臉部!
明天會教大家 ARKit 會怎麼判斷使用者臉部表情來做互動喔!

前置作業

建立一個專案,並在正中央拉一個跟螢幕等寬等高的 ARSCNView

像這樣子!

https://ithelp.ithome.com.tw/upload/images/20231013/20151391WH1ELOEdsC.png

也要記得宣告好 ARSCNView 的變數,以及 import ARKit

再來就是我們需要對 ARSCN View 在 viewWillAppear 做一些基礎的設定

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    // 宣告一個 config 變數,並給他一個 ARFaceTrackingConfiguration() 的實體
    let config = ARFaceTrackingConfiguration()
     // 開始運行 ARKit 的視訊捕捉
    vARSCN.session.run(config)
}

整體而言,你的程式碼會像這樣子:

https://ithelp.ithome.com.tw/upload/images/20231013/201513915ldv3T0CHh.png

設定臉部網格

我們要先在 ViewController 新增 ARSCNViewDelegate

並在裡面新增一個 renderer(_nodeFor:)

extension MainViewController: ARSCNViewDelegate  {
    // 在 ARSCNView 呈現時執行
    func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {
        // 設給一個常數 faceMesh
        let faceMesh = ARSCNFaceGeometry(device: vARSCN.device!)
        // 把圖像資訊指派給 SCNNode,並設置材料 (material) 為 node
        let node = SCNNode(geometry: faceMesh)
        // 臉部網格的填充方去可以使用 .fill , 但這邊我喜歡以線填充的方式呈現
        node.geometry?.firstMaterial?.fillMode = .lines
        return node
    }
}

既然有在 ViewController 設定 ARSCNViewDelegate 了,那也要在 viewDidLoad 將 ARSCNView 的 Delegate 指向自己囉!

override func viewDidLoad() {
    super.viewDidLoad()
    vARSCN.delegate = self
}

你的程式碼會長這樣子:

https://ithelp.ithome.com.tw/upload/images/20231013/20151391S3KwmcdrBo.png

各位現在可以執行看看你的 APP 囉! 但在開始測試之前,記得要在 info.plist 新增相機權限,不然他可是會報錯的!

https://ithelp.ithome.com.tw/upload/images/20231013/20151391pbkyvmbkWY.png

各位的臉上是不是會出現這樣子的網格呢?如果是的話就代表裝置有成功追蹤到你的臉喔!

https://ithelp.ithome.com.tw/upload/images/20231013/20151391aMXokXRwjW.png

更新臉部網格

在上面的程式設定完之後,你會發現他其實並不會跟著你的臉部進行變化,那我們就要在多設定一些 func 讓他自動更新!

新增 renderer(_didUpdate:) 讓他進行更新

func renderer(_ renderer: SCNSceneRenderer, didUpdate node: SCNNode, for anchor: ARAnchor) {
    // 定義一個 faceAnchor 為 sceneView 內臉部被偵測到的錨點 (anchor)。這個錨點是當執行臉部追蹤 AR session 時,被偵測臉部的姿態 、拓撲 (topology)、表情的資料
    if let faceAnchor = anchor as? ARFaceAnchor, let faceGeometry = node.geometry as? ARSCNFaceGeometry {
        faceGeometry.update(from: faceAnchor.geometry)
    }
}

你的 extension 看起來會是這樣子的:

https://ithelp.ithome.com.tw/upload/images/20231013/20151391KRgvb5FbCL.png

如果你所有的臉部網格有隨著臉部動作進行更新的話就代表你成功囉!今天的教學就到這裡,明天會教你們如何判斷臉部表情!


上一篇
鐵人賽 [Day 27] ARKit 教學(2)
下一篇
鐵人賽 [Day 29] ARKit 教學(4)
系列文
iOS 菜雞的開發日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言